Typical HAL DCMI use cases for migration ¶
This section provides information about the applicable HAL DCMI use cases for migration.
Use case: DCMI snapshot capture ¶
Capture a single frame using hardware synchronization. The application receives one frame callback.
Sequence diagram ¶
Code snippet ¶
|
HAL1 |
HAL2 |
|---|---|
DCMI_HandleTypeDef hdcmi;
DMA_HandleTypeDef hdma;
uint32_t *buf = (uint32_t*)0x24000000U;
uint32_t words = 640U * 480U * 2U / 4U;
hdcmi.Instance = DCMI;
hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;
hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL;
hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD;
hdcmi.Init.LineSelectMode = DCMI_LSM_ALL;
hdcmi.Init.LineSelectStart = DCMI_OELS_ODD;
HAL_DCMI_Init(&hdcmi);
__HAL_LINKDMA(&hdcmi, DMA_Handle, hdma);
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, buf, words);
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
}
HAL_DCMI_DeInit(&hdcmi);
|
hal_dcmi_handle_t hdcmi;
hal_dma_handle_t hdma;
hal_dcmi_parallel_config_t cfg;
hal_dcmi_pipe_config_t pipe;
uint32_t *buf = (uint32_t*)0x24000000U;
uint32_t len = 640U * 480U * 2U;
HAL_DCMI_Init(&hdcmi, HAL_DCMI);
HAL_DCMI_SetDMA(&hdcmi, &hdma);
cfg.format = HAL_DCMI_FORMAT_UNCOMPRESSED;
cfg.pixel_polarity = HAL_DCMI_PIXEL_CLOCK_RISING;
cfg.hsync_polarity = HAL_DCMI_HSYNC_HIGH;
cfg.vsync_polarity = HAL_DCMI_VSYNC_HIGH;
cfg.data_width = HAL_DCMI_EXTENDED_DATA_8_BITS;
HAL_DCMI_PARALLEL_SetConfig(&hdcmi, &cfg);
/* Synchro mode is set to HARDWARE by default */
pipe.frame_rate = HAL_DCMI_FRAME_CAPTURE_ALL;
HAL_DCMI_SetConfigPipe(&hdcmi, HAL_DCMI_PIPE_0, &pipe);
HAL_DCMI_StartPipe_DMA(&hdcmi, HAL_DCMI_PIPE_0, HAL_DCMI_CAPTURE_SNAPSHOT, buf, len);
void HAL_DCMI_PipeFrameEventCallback(hal_dcmi_handle_t *hdcmi, hal_dcmi_pipe_t pipe)
{
}
HAL_DCMI_DeInit(&hdcmi);
|
Key changes ¶
HAL2 introduces pipeline-based capture through
HAL_DCMI_StartPipe_DMA().HAL2 separates DMA association and configuration using
HAL_DCMI_SetDMA(),HAL_DCMI_PARALLEL_SetConfig(), andHAL_DCMI_SetConfigPipe().Frame callback becomes pipe-specific with
HAL_DCMI_PipeFrameEventCallback().
Use case: DCMI continuous capture ¶
Capture frames continuously from a parallel camera stream. A frame completion callback notifies the application each time a frame finishes.
Sequence diagram ¶
Code snippet ¶
|
HAL1 |
HAL2 |
|---|---|
#define FRAME_BUFFER_ADDR (0x24000000U)
#define FRAME_WORDS (640U * 480U * 2U / 4U)
DCMI_HandleTypeDef hdcmi;
DMA_HandleTypeDef hdma;
hdcmi.Instance = DCMI;
hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;
hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;
hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL;
hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD;
hdcmi.Init.LineSelectMode = DCMI_LSM_ALL;
hdcmi.Init.LineSelectStart = DCMI_OELS_ODD;
HAL_DCMI_Init(&hdcmi);
__HAL_LINKDMA(&hdcmi, DMA_Handle, hdma);
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t*)FRAME_BUFFER_ADDR, FRAME_WORDS);
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
}
HAL_DCMI_DeInit(&hdcmi);
|
#define FRAME_BUFFER_ADDR (0x24000000U)
#define FRAME_SIZE_BYTES (640U * 480U * 2U)
hal_dcmi_handle_t hdcmi;
hal_dma_handle_t hdma;
hal_dcmi_parallel_config_t parallel_cfg;
hal_dcmi_pipe_config_t pipe_cfg;
HAL_DCMI_Init(&hdcmi, HAL_DCMI);
HAL_DCMI_SetDMA(&hdcmi, &hdma);
parallel_cfg.format = HAL_DCMI_FORMAT_UNCOMPRESSED;
parallel_cfg.pixel_polarity = HAL_DCMI_PIXEL_CLOCK_FALLING;
parallel_cfg.hsync_polarity = HAL_DCMI_HSYNC_HIGH;
parallel_cfg.vsync_polarity = HAL_DCMI_VSYNC_HIGH;
parallel_cfg.data_width = HAL_DCMI_EXTENDED_DATA_8_BITS;
HAL_DCMI_PARALLEL_SetConfig(&hdcmi, ¶llel_cfg);
/* Synchro mode is set to HARDWARE by default */
pipe_cfg.frame_rate = HAL_DCMI_FRAME_CAPTURE_ALL;
HAL_DCMI_SetConfigPipe(&hdcmi, HAL_DCMI_PIPE_0, &pipe_cfg);
HAL_DCMI_StartPipe_DMA(&hdcmi, HAL_DCMI_PIPE_0, HAL_DCMI_CAPTURE_CONTINUOUS, (uint32_t*)FRAME_BUFFER_ADDR, FRAME_SIZE_BYTES);
void HAL_DCMI_PipeFrameEventCallback(hal_dcmi_handle_t *hdcmi, hal_dcmi_pipe_t pipe)
{
}
HAL_DCMI_DeInit(&hdcmi);
|
Key changes ¶
HAL2 performs continuous capture through
HAL_DCMI_StartPipe_DMA()instead ofHAL_DCMI_Start_DMA().HAL2 provides a dedicated DMA association API (
HAL_DCMI_SetDMA()) and pipe configuration APIs.Continuous-frame notifications use
HAL_DCMI_PipeFrameEventCallback().
Use case: DCMI continuous capture with decimation ¶
Capture continuous frames using decimation. The application is notified per frame via a callback.
Sequence diagram ¶
Code snippet ¶
|
HAL1 |
HAL2 |
|---|---|
DCMI_HandleTypeDef hdcmi;
DMA_HandleTypeDef hdma;
uint32_t *buf = (uint32_t*)0x24000000U;
uint32_t words = 640U * 480U * 2U / 4U;
hdcmi.Instance = DCMI;
hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;
hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;
hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi.Init.ByteSelectMode = DCMI_BSM_ALTERNATE_2;
hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD;
hdcmi.Init.LineSelectMode = DCMI_LSM_ALTERNATE_2;
hdcmi.Init.LineSelectStart = DCMI_OELS_EVEN;
HAL_DCMI_Init(&hdcmi);
__HAL_LINKDMA(&hdcmi, DMA_Handle, hdma);
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, buf, words);
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
}
HAL_DCMI_DeInit(&hdcmi);
|
hal_dcmi_handle_t hdcmi;
hal_dma_handle_t hdma;
hal_dcmi_parallel_config_t parallel_cfg;
hal_dcmi_pipe_config_t pipe_cfg;
uint32_t *buf = (uint32_t*)0x24000000U;
uint32_t len = 640U * 480U * 2U;
HAL_DCMI_Init(&hdcmi, HAL_DCMI);
HAL_DCMI_SetDMA(&hdcmi, &hdma);
parallel_cfg.format = HAL_DCMI_FORMAT_UNCOMPRESSED;
parallel_cfg.pixel_polarity = HAL_DCMI_PIXEL_CLOCK_FALLING;
parallel_cfg.hsync_polarity = HAL_DCMI_HSYNC_HIGH;
parallel_cfg.vsync_polarity = HAL_DCMI_VSYNC_HIGH;
parallel_cfg.data_width = HAL_DCMI_EXTENDED_DATA_8_BITS;
HAL_DCMI_PARALLEL_SetConfig(&hdcmi, ¶llel_cfg);
/* Synchro mode is set to HARDWARE by default */
pipe_cfg.frame_rate = HAL_DCMI_FRAME_CAPTURE_ALL;
HAL_DCMI_SetConfigPipe(&hdcmi, HAL_DCMI_PIPE_0, &pipe_cfg);
HAL_DCMI_SetPipeBytesDecimation(&hdcmi, HAL_DCMI_PIPE_0,
HAL_DCMI_BYTE_CAPTURE_2BYTE_OUT_4_ODD);
HAL_DCMI_SetPipeLinesDecimation(&hdcmi, HAL_DCMI_PIPE_0,
HAL_DCMI_LINE_CAPTURE_1LINE_OUT_2_EVEN);
HAL_DCMI_StartPipe_DMA(&hdcmi, HAL_DCMI_PIPE_0, HAL_DCMI_CAPTURE_CONTINUOUS, buf, len);
void HAL_DCMI_PipeFrameEventCallback(hal_dcmi_handle_t *hdcmi, hal_dcmi_pipe_t pipe)
{
}
HAL_DCMI_DeInit(&hdcmi);
|
Key changes ¶
HAL2 configures decimation through
HAL_DCMI_SetPipeBytesDecimation()andHAL_DCMI_SetPipeLinesDecimation().HAL2 performs capture through a pipe using
HAL_DCMI_StartPipe_DMA().Frame notifications are pipe-specific through
HAL_DCMI_PipeFrameEventCallback().





